枚举是常量整数值的列表。它可以用来代替使用#define定义常量值。但除此之外,我还没有发现枚举在C和CPP中有任何实质性用途。谁能告诉我枚举的确切用途是什么。最初我认为如果我们创建一个枚举变量并分配一个不在枚举值中的值,编译器会大喊大叫。但事实并非如此。我们可以为枚举变量分配任何值。我想不出枚举的任何实质性用途。 最佳答案 枚举在编程中非常有用,因为它们使您的代码更具可读性和一致性。例如:假设我们有以下switch语句:switch(fruit){case1://codegoesherebreak;case2://codegoes
我是编程新手,我正在努力思考“指针”的概念。intmain(){intx=5;int*pointerToInteger=&x;cout为什么当我cout输出是一个十六进制值,但是当我使用cout时输出为5(x=5)。 最佳答案 *根据上下文有不同的含义。指针声明int*ap;//Itdefinesaptobeapointertoanint.voidfoo(int*p);//Declaresfunctionfoo.//fooexpectsapointertoanintasanargument.取消引用表达式中的指针。inti=0;in
我查看了DirectX2009年3月SDK附带的DXUTCore项目,注意到他们没有制作普通的访问器方法,而是使用宏来创建通用访问器,类似于以下内容:#defineGET_ACCESSOR(x,y)inlinexGet##y(){DXUTLockl;returnm_state.m_##y;};...GET_ACCESSOR(WCHAR*,WindowTitle);##运算符似乎只是将第二个参数的文本插入到宏中,以创建一个使用该文本对变量进行操作的函数。这是C++中的标准(即不是Microsoft特定的)吗?它的使用被认为是好的做法吗?而且,那个运算符叫什么?
C++核心指南提到跨度,而不是“多跨度”。但是-我看到微软的GSL实现有一个multi_spanclasstemplateclassmulti_span{...};所以,显然这是某种多维版本的gsl::span。但那是什么意思呢?为什么我们需要这个多维跨度,或者更确切地说-我们什么时候使用它?我似乎找不到关于此的任何文档。 最佳答案 简而言之,它是一block连续的内存,代表多维数组。这是一个使用示例:intdata[6]={0,1,2,3,4,5};multi_spanspan{data,6};std::cout从链接源来看,它似
我刚刚发现qt_noop()的存在,在qglobal.h中定义为:inlinevoidqt_noop(){}这有什么意义? 最佳答案 “noop”名称是“nooperation”的缩写,意思是它是一个什么都不做的占位符函数。您可能还知道NOP,它存在于汇编语言中。我知道它在一些宏内部使用,这些宏应该只为调试构建做一些事情,例如:#ifndefQT_NO_DEBUG#defineQ_ASSERT(cond)((!(cond))?qt_assert(#cond,__FILE__,__LINE__):qt_noop())#else#def
根据[dcl.fct]/2下面的片段是合法的。GCCandclangcompileandexecutethecode,#includeinti=-1;autof()->auto&&{returni;}intmain(){f()=2;std::cout打印2但是在C++中允许这样做的目的是什么?在上面的示例中,只需将trailing-return-type替换为int&即可获得相同的结果。换句话说,我正在寻找一个示例,其中包含占位符类型的trailing-return-type是有意义的。 最佳答案 您可以就一致性提出争论:您可以将其
在QtSource文件中,有两个版本的头文件,如:qxmlstream.hqxmlstream_p.h为什么会有_p.h文件? 最佳答案 它们通常是私有(private)头文件,用于使子系统的组件了解所有内容,但用户不需要。换句话说,如果Qt的用户不需要知道的话,Qt中的多个C源文件可能想知道的东西会在私有(private)头文件中。一个示例可能是为您的子系统定制的内存分配器。也许你知道你所做的每个内存分配都是128字节,那么你可以提供这样一个分配器:void*malloc128(void){...}由于这对您的子系统的用户来说可能
在什么情况下你想定义对某block内存的引用?例如:constint&r=8;而不是简单地写:intr=8; 最佳答案 用较短的引用替换对对象的长表达式很有用,并使代码更具可读性。例如:constint&SphereRadius=Configuration::getInstance()->sphere->radius;只要配置同时发生变化(例如在另一个线程中),您的引用就会更新。您展示的代码只是一个更强大工具的简单可能性。在许多情况下,您的示例在您之前的理解中毫无意义。这些引用的主要目标是为对象添加别名。通过对函数的引用传递对象,并
除了main函数中的第二行:int*end=array+5;外,我了解其中的大部分工作原理。那条线是如何工作的?#inlcudeintmain(){intarray[]={10,20,29,200,2};int*end=array+5;for(int*it=array;it!=end;++it){std::cout它应该只打印列表中的每个元素。 最佳答案 it!=end;表示它到达了位置[5],也就是最后一个(4)之后的一个。int*end=array+5;只是创建一个指向[5]位置的变量。它有效,但更干净和安全的版本是:for(i
我知道它是为了防止多次包含头文件。但是假设我确保只将此文件包含在一个.cpp文件中一次。是否还有我需要这种保护措施的情况? 最佳答案 不,这是include守卫的唯一目的,但使用它们应该是一个明智的选择:这样做需要很少的时间并且可能节省很多。 关于c++-#ifndefFILENAME....#endif在头文件中的用途,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/219818